Datos

library(tidyquant)
Loading required package: lubridate

Attaching package: ‘lubridate’

The following objects are masked from ‘package:base’:

    date, intersect, setdiff, union

Loading required package: PerformanceAnalytics
Loading required package: xts
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric


Attaching package: ‘PerformanceAnalytics’

The following object is masked from ‘package:graphics’:

    legend

Loading required package: quantmod
Loading required package: TTR
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
library(tidyverse)
── Attaching core tidyverse packages ─────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr   1.1.4     ✔ readr   2.1.5
✔ forcats 1.0.0     ✔ stringr 1.5.1
✔ ggplot2 3.4.4     ✔ tibble  3.2.1
✔ purrr   1.0.2     ✔ tidyr   1.3.0── Conflicts ───────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::first()  masks xts::first()
✖ dplyr::lag()    masks stats::lag()
✖ dplyr::last()   masks xts::last()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(tsibble)

Attaching package: ‘tsibble’

The following object is masked from ‘package:zoo’:

    index

The following object is masked from ‘package:lubridate’:

    interval

The following objects are masked from ‘package:base’:

    intersect, setdiff, union
library(fable)
Loading required package: fabletools

Attaching package: ‘fable’

The following object is masked from ‘package:tidyquant’:

    VAR
library(feasts)
index = tq_index("SP500") %>% select(symbol, weight)
Getting holdings for SP500
index = index %>% filter(symbol != "-")
index
sum(index$weight)
[1] 0.9961429
data = tq_get(index$symbol, get = "stock.prices", from = "2022-01-01", to = "2024-03-29") %>% select(symbol, date, adjusted)
Warning: There were 2 warnings in `dplyr::mutate()`.
The first warning was:
ℹ In argument: `data.. = purrr::map(...)`.
Caused by warning:
! x = 'GEV', get = 'stock.prices': Error in getSymbols.yahoo(Symbols = "GEV", env = <environment>, verbose = FALSE, : Unable to import “GEV”.
HTTP error 400.
 Removing GEV.
ℹ Run ]8;;ide:run:dplyr::last_dplyr_warnings()dplyr::last_dplyr_warnings()]8;; to see the 1 remaining
  warning.
data = as_tsibble(data, key = symbol, index = date, regular = TRUE)
#data = fill_gaps(data) %>% fill(adjusted, .direction = "down")
#data = mutate(data, t = row_number())
#data = update_tsibble(data, index = t)

Split de datos

train = data %>% filter(date < "2024-03-03")
test = data %>% filter(date > "2024-03-04")

Modelos

ETS y ARIMA

sp500_arima_ets = train %>% model(arima = ARIMA(adjusted),
                                  ets = ETS(adjusted))
Warning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs produced
sp500_arima_ets
ticker = "ABNB"
sp500_arima_ets %>% filter(symbol == ticker) %>% augment() |>
  ggplot(aes(x = t)) +
  geom_line(aes(y = adjusted, colour = "reales")) +
  geom_line(aes(y = .fitted, colour = "ajustados")) +
  labs(y = NULL,
    title = ticker
  ) +
  guides(colour = guide_legend(title = NULL))

LS0tCnRpdGxlOiAnUyZQIDUwMCcKc3VidGl0bGU6ICdDbGFzZSBzZXJpZXMgZGUgdGllbXBvLCBwcmltYXZlcmEgMjAyNCcKYXV0aG9yOiAnRGFuaWVsIE51w7FvLCBkYW5pZWwubnVub0BpdGVzby5teCcKZGF0ZTogIkFicmlsIDEwLCAyMDI0IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgdGhlbWU6IGNvc21vCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgZ2l0aHViX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIGRldjoganBlZwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKYGBge3Igc2V0dXAsIGVjaG8gPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gNykKYGBgCgpgYGB7PWh0bWx9CjxzdHlsZT4KLmZvcmNlQnJlYWsgeyAtd2Via2l0LWNvbHVtbi1icmVhay1hZnRlcjogYWx3YXlzOyBicmVhay1hZnRlcjogY29sdW1uOyB9Cjwvc3R5bGU+CmBgYAo8Y2VudGVyPiFbXShodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2QvZGIvTG9nb19JVEVTT19ub3JtYWwuanBnKXt3aWR0aD0iMjAlIn08L2NlbnRlcj4KCiMgRGF0b3MKCmBgYHtyfQpsaWJyYXJ5KHRpZHlxdWFudCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodHNpYmJsZSkKbGlicmFyeShmYWJsZSkKbGlicmFyeShmZWFzdHMpCmBgYAoKYGBge3J9CmluZGV4ID0gdHFfaW5kZXgoIlNQNTAwIikgJT4lIHNlbGVjdChzeW1ib2wsIHdlaWdodCkKaW5kZXggPSBpbmRleCAlPiUgZmlsdGVyKHN5bWJvbCAhPSAiLSIpCmluZGV4CnN1bShpbmRleCR3ZWlnaHQpCgpkYXRhID0gdHFfZ2V0KGluZGV4JHN5bWJvbCwgZ2V0ID0gInN0b2NrLnByaWNlcyIsIGZyb20gPSAiMjAyMy0wMS0wMSIsIHRvID0gIjIwMjQtMDMtMjkiKSAlPiUgc2VsZWN0KHN5bWJvbCwgZGF0ZSwgYWRqdXN0ZWQpCgpgYGAKCmBgYHtyfQpkYXRhID0gYXNfdHNpYmJsZShkYXRhLCBrZXkgPSBzeW1ib2wsIGluZGV4ID0gZGF0ZSwgcmVndWxhciA9IFRSVUUpCiNkYXRhID0gZmlsbF9nYXBzKGRhdGEpICU+JSBmaWxsKGFkanVzdGVkLCAuZGlyZWN0aW9uID0gImRvd24iKQojZGF0YSA9IG11dGF0ZShkYXRhLCB0ID0gcm93X251bWJlcigpKQojZGF0YSA9IHVwZGF0ZV90c2liYmxlKGRhdGEsIGluZGV4ID0gdCkKYGBgCgojIyBTcGxpdCBkZSBkYXRvcwoKYGBge3J9CnRyYWluID0gZGF0YSAlPiUgZmlsdGVyKGRhdGUgPCAiMjAyNC0wMy0wMyIpCnRlc3QgPSBkYXRhICU+JSBmaWx0ZXIoZGF0ZSA+ICIyMDI0LTAzLTA0IikKYGBgCgojIE1vZGVsb3MKCiMjIEVUUyB5IEFSSU1BCgpgYGB7cn0Kc3A1MDBfYXJpbWFfZXRzID0gdHJhaW4gJT4lIG1vZGVsKGFyaW1hID0gQVJJTUEoYWRqdXN0ZWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRzID0gRVRTKGFkanVzdGVkKSkKYGBgCgpgYGB7cn0Kc3A1MDBfYXJpbWFfZXRzCmBgYAoKYGBge3J9CnRpY2tlciA9ICJBQk5CIgpzcDUwMF9hcmltYV9ldHMgJT4lIGZpbHRlcihzeW1ib2wgPT0gdGlja2VyKSAlPiUgYXVnbWVudCgpIHw+CiAgZ2dwbG90KGFlcyh4ID0gdCkpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBhZGp1c3RlZCwgY29sb3VyID0gInJlYWxlcyIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gLmZpdHRlZCwgY29sb3VyID0gImFqdXN0YWRvcyIpKSArCiAgbGFicyh5ID0gTlVMTCwKICAgIHRpdGxlID0gdGlja2VyCiAgKSArCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwpKQpgYGAKCgo=